package ig.metrica.ejb.escenario;

import ig.metrica.ejb.dao.DaoOrigenesdatos;
import ig.metrica.escenario.DetalleescenarioDAO;
import ig.metrica.escenario.DetalleescenarioDTO;
import ig.util.ejb.IGBean;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.util.*;
import javax.ejb.*;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;

/**
 * This is the bean class for the EscenariosSBbeanBean enterprise bean.
 * Created 27/04/2007 08:29:45 AM
 * @author jsanchez
 */
public class EscenariosSBbeanBean implements SessionBean, EscenariosSBbeanRemoteBusiness {
    private SessionContext context;


    // <editor-fold defaultstate="collapsed" desc="EJB infrastructure methods. Click the + sign on the left to edit the code.">
    // TODO Add code to acquire and use other enterprise resources (DataSource, JMS, enterprise bean, Web services)
    // TODO Add business methods or web service operations
    /**
     * @see javax.ejb.SessionBean#setSessionContext(javax.ejb.SessionContext)
     */
    public void setSessionContext(SessionContext aContext) {
        context = aContext;
    }

    /**
     * @see javax.ejb.SessionBean#ejbActivate()
     */
    public void ejbActivate() {

    }

    /**
     * @see javax.ejb.SessionBean#ejbPassivate()
     */
    public void ejbPassivate() {

    }

    /**
     * @see javax.ejb.SessionBean#ejbRemove()
     */
    public void ejbRemove() {

    }
    // </editor-fold>

    /**
     * See section 7.10.3 of the EJB 2.0 specification
     * See section 7.11.3 of the EJB 2.1 specification
     */
    public void ejbCreate() {
        // TODO implement ejbCreate if necessary, acquire resources
        // This method has access to the JNDI context so resource aquisition
        // spanning all methods can be performed here such as home interfaces
        // and data sources.
    }

    PreparedStatement pre=null;
    PreparedStatement pre1=null;
    Connection conn=null;
    ResultSet res=null;
    ResultSet res1=null;
    // Add business logic below. (Right-click in editor and choose
    // "EJB Methods > Add Business Method" or "Web Service > Add Operation")

    public Collection findAll() throws Exception {
        //TODO implement findAll
        conn=this.getConexion();
        reloadTablasGuardar();
        try {
            Collection CC=new ArrayList();
//            pre=conn.prepareStatement("SELECT ID, NOMBRE, IDMODELO, HORAINICIO, HORAFIN, FECHA, ESTADO, FECHAPROCESO FROM ESCENARIOS");
            pre=conn.prepareStatement(
                    "SELECT MO.NOMBRE AS MODELO,MO.TIPO_MODELO as TIPO_MODELO, MC.TIPO as TIPO_MATRIZ, ES.ID, ES.NOMBRE, ES.IDMODELO, ES.HORAINICIO, ES.HORAFIN, ES.FECHA, ES.ESTADO, ES.FECHAPROCESO " +
                    "FROM ESCENARIOS ES " +
                    "INNER JOIN MODELOS MO ON MO.ID = ES.IDMODELO "+
                    "INNER JOIN MATRICESCORRELACION MC ON MC.ID = MO.IDMATRIZ "+
                    "ORDER BY ES.ID DESC");
            res=pre.executeQuery();

            while(res.next()){
                EscenariosDTO DTO=new EscenariosDTO();
                DTO.setEstado(res.getInt("ESTADO"));
                DTO.setFecha(res.getTimestamp("FECHA"));
                DTO.setFechaproceso(res.getTimestamp("FECHAPROCESO"));
                DTO.setHorafin(res.getString("HORAFIN"));
                DTO.setHorainicio(res.getString("HORAINICIO"));
                DTO.setId(res.getInt("ID"));
                DTO.setIdmodelo(res.getInt("IDMODELO"));
                DTO.setNombre(res.getString("NOMBRE"));
                DTO.setModelo(res.getString("MODELO"));
                DTO.setTipoMatriz(res.getInt("TIPO_MATRIZ"));
                DTO.setTipoModelo(res.getInt("TIPO_MODELO"));
                CC.add(DTO);
            }
            return CC;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }finally{
            this.close(conn);
            this.close(res);
            this.close(pre);
        }
    }
    public EscenariosDTO findById(Integer id) throws Exception {
        conn=this.getConexion();
        try {
            Collection CC=new ArrayList();
            pre=conn.prepareStatement(
                    "SELECT MO.NOMBRE AS MODELO,MO.TIPO_MODELO as TIPO_MODELO, MC.TIPO as TIPO_MATRIZ, ES.ID, ES.NOMBRE, ES.IDMODELO, ES.HORAINICIO, ES.HORAFIN, ES.FECHA, ES.ESTADO, ES.FECHAPROCESO " +
                    "FROM ESCENARIOS ES " +
                    "INNER JOIN MODELOS MO ON MO.ID = ES.IDMODELO "+
                    "INNER JOIN MATRICESCORRELACION MC ON MC.ID = MO.IDMATRIZ "+
                    "where ES.ID=?");
            pre.setInt(1,id);
            res=pre.executeQuery();
            if(res.next()){
                EscenariosDTO DTO=new EscenariosDTO();
                DTO.setEstado(res.getInt("ESTADO"));
                DTO.setFecha(res.getTimestamp("FECHA"));
                DTO.setFechaproceso(res.getTimestamp("FECHAPROCESO"));
                DTO.setHorafin(res.getString("HORAFIN"));
                DTO.setHorainicio(res.getString("HORAINICIO"));
                DTO.setId(res.getInt("ID"));
                DTO.setIdmodelo(res.getInt("IDMODELO"));
                DTO.setNombre(res.getString("NOMBRE"));
                DTO.setModelo(res.getString("MODELO"));
                DTO.setTipoMatriz(res.getInt("TIPO_MATRIZ"));
                DTO.setTipoModelo(res.getInt("TIPO_MODELO"));
                Collection CTablas=new ArrayList();
                
                DetalleescenarioDAO detalleescenarioDAO = new DetalleescenarioDAO();
                List<DetalleescenarioDTO> detalleescenarioDTOs = detalleescenarioDAO.findByIdescenario(DTO.getId());
                
                DTO.setDetalleescenarioDTOs(detalleescenarioDTOs);
//                String CONSULTA="SELECT COUNT(*) FROM _TABLA_ WHERE IDESCENARIO = _ID_";
//                Statement stat=null;
//                Object[] count=null;
//                stat=conn.createStatement();
//                for (String elem : this.tablasGuardar) {
//                    count=new Object[2];
//                    res1=stat.executeQuery(CONSULTA.replaceAll("_TABLA_",elem).replaceAll("_ID_",id.toString()));
//                    res1.next();
//                    count[0]=elem;
//                    count[1]=res1.getObject(1);
//                    CTablas.add(count);
//                    this.close(res1);
//                }
//                this.close(stat);
                DTO.setCTablas(CTablas);
                return DTO;
            }
        } catch (Exception e) {
            throw e;
        } catch (Throwable e) {
            throw new Exception(e);
        }finally{
            this.close(conn);
            this.close(res);
            this.close(pre);
        }
        return null;
    }

    public EscenariosDTO findTablasById(Integer id, String alias_vistas) throws Exception {
        conn=this.getConexion();
        try {
            Collection CC=new ArrayList();
            pre=conn.prepareStatement(
                    "SELECT MO.NOMBRE AS MODELO,MO.TIPO_MODELO as TIPO_MODELO, MC.TIPO as TIPO_MATRIZ, ES.ID, ES.NOMBRE, ES.IDMODELO, ES.HORAINICIO, ES.HORAFIN, ES.FECHA, ES.ESTADO, ES.FECHAPROCESO " +
                    "FROM ESCENARIOS ES " +
                    "INNER JOIN MODELOS MO ON MO.ID = ES.IDMODELO "+
                    "INNER JOIN MATRICESCORRELACION MC ON MC.ID = MO.IDMATRIZ "+
                    "where ES.ID=?");
            pre.setInt(1,id);
            res=pre.executeQuery();
            if(res.next()){
                EscenariosDTO DTO=new EscenariosDTO();
                DTO.setEstado(res.getInt("ESTADO"));
                DTO.setFecha(res.getTimestamp("FECHA"));
                DTO.setFechaproceso(res.getTimestamp("FECHAPROCESO"));
                DTO.setHorafin(res.getString("HORAFIN"));
                DTO.setHorainicio(res.getString("HORAINICIO"));
                DTO.setId(res.getInt("ID"));
                DTO.setIdmodelo(res.getInt("IDMODELO"));
                DTO.setNombre(res.getString("NOMBRE"));
                DTO.setModelo(res.getString("MODELO"));
                DTO.setTipoMatriz(res.getInt("TIPO_MATRIZ"));
                DTO.setTipoModelo(res.getInt("TIPO_MODELO"));
                
                DetalleescenarioDAO detalleescenarioDAO = new DetalleescenarioDAO();
                List<DetalleescenarioDTO> detalleescenarioDTOs = detalleescenarioDAO.findByIdescenario(DTO.getId());
                DTO.setDetalleescenarioDTOs(detalleescenarioDTOs);
                
                Collection CTablas=new ArrayList();
                String CONSULTA="SELECT COUNT(*) FROM _TABLA_ WHERE IDESCENARIO = _ID_";
                Statement stat=null;
                Object[] count=null;
                stat=conn.createStatement();
                this.reloadTablasGuardar();
                for (String elem : this.tablasGuardar) {
                    count=new Object[2];
                    res1=stat.executeQuery(CONSULTA.replaceAll("_TABLA_",elem).replaceAll("_ID_",id.toString()));
                    res1.next();
                    count[0]=elem;
                    count[1]=res1.getObject(1);
                    CTablas.add(count);
                    this.close(res1);
                }

                String query = null;


                if(!alias_vistas.trim().equals("")){
                    StringTokenizer tokens = new StringTokenizer(alias_vistas.trim(),";");
                    while (tokens.hasMoreElements()) {
                        String alias = (String)tokens.nextElement();
                        if(conn.getMetaData().getDriverName().contains("jTDS Type 4 JDBC Driver for MS SQL Server and Sybase"))
                            query = "SELECT so.name AS TABLE_NAME FROM sys.objects so " +
                                    "WHERE so.type = 'V' AND so.name like '" + alias + "' " +
                                    "ORDER BY so.name";
                        else
                            query = "SELECT view_name AS TABLE_NAME FROM all_views " +
                                    "WHERE OWNER = 'METRICADW' AND VIEW_NAME like '" + alias + "'";

                        ResultSet result_views = stat.executeQuery(query);

                        while(result_views.next()){
                            count=new Object[2];

                            String view_name = result_views.getString(1);
                            //System.out.println(result_views.getString(1));

                            String CONSULTA_ID = "";

                            if(conn.getMetaData().getDriverName().contains("jTDS Type 4 JDBC Driver for MS SQL Server and Sybase"))
                                CONSULTA_ID = "SELECT count(so.name) aparece  FROM sys.objects so " +
                                                                                    "INNER JOIN sys.columns sc ON so.object_id = sc.object_id " +
                                                                                    "INNER JOIN sys.types st ON st.system_type_id = sc.system_type_id AND st.name != 'sysname' " +
                                                     "WHERE so.type = 'V' AND so.name = '" + view_name + "' AND sc.name = 'IDESCENARIO'";
                            else
                                CONSULTA_ID =   "SELECT COUNT(TABLE_NAME) from all_tab_columns " +
                                                "WHERE OWNER = 'METRICADW' " +
                                                "AND TABLE_NAME = '" + view_name + "' " +
                                                "AND COLUMN_NAME = 'IDESCENARIO'";

                            Statement stat2 = conn.createStatement();
                            ResultSet res2 =  stat2.executeQuery(CONSULTA_ID);
                            res2.next();
                            String view = "";

                            if(res2.getInt(1) > 0)
                                view = "SELECT COUNT(*) FROM " + view_name + " WHERE IDESCENARIO = " + id.toString();
                            else
                                view = "SELECT COUNT(*) FROM " + view_name;

                            Statement stat3 = conn.createStatement();
                            ResultSet res3 =  stat3.executeQuery(view);
                            res3.next();
                            count[0]=view_name;
                            count[1]=res3.getObject(1);
                            CTablas.add(count);
                            this.close(res3);

                        }
                    }
                }
                this.close(stat);
                DTO.setCTablas(CTablas);
                return DTO;
            }
        } catch (Exception e) {
            throw e;
        } catch (Throwable e) {
            throw new Exception (e);            
        }finally{
            this.close(conn);
            this.close(res);
            this.close(pre);
        }
        return null;
    }

    public Hashtable findData(String namaTabla, Integer idEscenario) throws Exception {
        conn=this.getConexion();
        Hashtable ht=new Hashtable();
        if(namaTabla!=null && idEscenario!=null){
            try {
//                Collection CC=new ArrayList();
                try {
                    pre=conn.prepareStatement("SELECT * FROM "+namaTabla.toUpperCase().trim()+" WHERE IDESCENARIO=?");
                    pre.setInt(1,idEscenario);
                    res=pre.executeQuery();
                } catch (Exception e) {
                    pre=conn.prepareStatement("SELECT * FROM "+namaTabla.toUpperCase().trim());
                    res=pre.executeQuery();
                }
                
                
//                Collection CCTemp=new ArrayList();
                if(res!=null){
                    Integer n = res.getMetaData().getColumnCount();
                    String[] nombreCol= new String[n];
                    for (int i = 1; i <=n; i++) {
                        nombreCol[i-1]=res.getMetaData().getColumnLabel(i);
                    }
                    
                    Collection<Object[]> c= new ArrayList();
                    while(res.next()){
                        Object[] obj= new Object[n];
                        for (int i = 1; i <= nombreCol.length; i++) {

                            if (res.getObject(i) instanceof Date) {
                                obj[i-1]= res.getDate(i);
                            } else if (res.getObject(i) instanceof Integer) {
                                obj[i-1]= res.getInt(i);
                            } else if (res.getObject(i) instanceof Double) {

                                try {

                                    if(res.getString(i).indexOf("E") > 0){
                                        obj[i-1]= res.getBigDecimal(i).toBigIntegerExact();
                                    }else{
                                        obj[i-1]= res.getDouble(i);
                                    }
                                        
                                } catch (Exception e) {
                                    obj[i-1]= res.getDouble(i);
                                }

                                //obj[i-1]= res.getDouble(i);

                                //obj[i-1] = BigDecimal.valueOf(Math.round(new Double(res.getObject(i).toString())* 10000000D) / 10000000D);
                            }else if (res.getObject(i) instanceof BigDecimal) {
                                obj[i-1]= res.getBigDecimal(i).toPlainString();
                            } else if (res.getObject(i) instanceof String) {
                                obj[i-1]= res.getString(i);
                            }else{
                                obj[i-1]= res.getObject(i);
                            }
                        }
                        c.add(obj);


                    }

                    Object[][] data=new Object[c.size()][n];
                    int i=0;
                    for (Object[] elem : c) {
                        for (int j = 0; j < n; j++) {
                            if(elem[j]==null)
                                data[i][j]="<null>";
                            else if(elem[j].getClass().getName().equals("java.sql.Date") || elem[j].getClass().getName().equals("java.util.Date")||elem[j].getClass().getName().equals("java.sql.Timestamp")){
                                if(elem[j] instanceof java.sql.Date)
                                    data[i][j]=new Timestamp(((java.sql.Date)elem[j]).getTime()).toString().substring(0,10);
                                else if(elem[j] instanceof java.sql.Timestamp)
                                    data[i][j]=new Timestamp(((java.sql.Timestamp)elem[j]).getTime()).toString().substring(0,10);
                                else if(elem[j] instanceof java.util.Date)
                                    data[i][j]=new Timestamp(((java.util.Date)elem[j]).getTime()).toString().substring(0,10);

                            /*
                             * Modificado Por Cristhiam Reina
                             * Modificado el 5 de Agosto del 2011
                             * Se arreglo el if
                             */
                            }else if(elem[j].getClass().getName().equals("java.lang.Double")){


                                //(elem[j].toString().substring(elem[j].toString().indexOf(".") + 1, (elem[j].toString().length()) )).length();
                                if((elem[j].toString().substring(elem[j].toString().indexOf(".") + 1, (elem[j].toString().length()) )).length() == 1
                                    && (elem[j].toString().substring(elem[j].toString().indexOf(".") + 1, (elem[j].toString().length()) )).equals("0"))
                                    
                                    data[i][j] = new Integer(elem[j].toString().substring(0, elem[j].toString().indexOf(".")));
                                else
                                    data[i][j] = BigDecimal.valueOf(Math.round(new Double(elem[j].toString())* 10000000D) / 10000000D);
                            }else{
                                data[i][j]=elem[j];
                            }
                        }
                        i++;
                    }
                    ht.put("COLUMNAS",nombreCol);
                    ht.put("DATOS",data);
                    return ht;
                }
            } catch (Exception e) {
                throw e;
            }finally{
                this.close(conn);
                this.close(res);
                this.close(pre);
            }
        }
        return null;
    }

    public void delete(Integer idEscenario,String tablas ) throws Exception {
        conn=this.getConexion();
        try {
//            Collection CC=new ArrayList();
            pre=conn.prepareStatement("DELETE FROM "+tablas.toUpperCase().trim()+" WHERE IDESCENARIO=?");
            pre.setInt(1,idEscenario);
            pre.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }finally{
            this.close(conn);
            this.close(res);
            this.close(pre);
        }
    }

    public void delete(Integer idEscenario) throws Exception {
        conn=this.getConexion();
        try {
//            Collection CC=new ArrayList();
             //Guardar el historico de la tabla METRICADW.FACTORESRIESGO Y LA VISTA METRICADW.V_MCH_051
            //Jchuquen 27-08-2010
            String SqlString = "";
            ////Se llena el historico de FACTORESRIESGO
            SqlString = "DELETE FROM HISFACTORESRIESGO WHERE IDESCENARIO = ? ";
            pre = conn.prepareStatement(SqlString);
            pre.setInt(1, idEscenario);
            pre.execute();
            this.close(pre);
            ////Se llena el historico de V_MCH_051
            SqlString = "DELETE FROM HIS_V_MCH_051 WHERE IDESCENARIO = ? ";
            pre = conn.prepareStatement(SqlString);
            pre.setInt(1, idEscenario);
            pre.execute();
            this.close(pre);
            //Fin
            pre=conn.prepareStatement("DELETE FROM ESCENARIOS WHERE ID = ?");
            pre.setInt(1,idEscenario);
            pre.executeUpdate();
        } catch (Exception e) {
            throw e;
        }finally{
            this.close(conn);
            this.close(res);
            this.close(pre);
        }
    }

    public Connection getConexion() throws NamingException, SQLException{
        /*DataSource ds = (DataSource)new InitialContext().lookup("java:/METRICADW");
        return ds.getConnection();*/
        return new IGBean().getConexion("METRICADW");
    }

    public Connection getConexionDb() throws NamingException, SQLException{
        /*DataSource ds = (DataSource)new InitialContext().lookup("java:/METRICADB");
        return ds.getConnection();*/
        return new IGBean().getConexion("METRICADB");
    }

    public Collection consulOrigenes(Integer idescenario){
        DaoOrigenesdatos daoOri = new DaoOrigenesdatos();
        return daoOri.getOrigenesdatosEscenario(idescenario);
    }

    private void close(Connection con){
        try {con.close();} catch (Exception e) {}
    }
    private void close(PreparedStatement prep){
        try {prep.close();} catch (Exception e) {}
    }
    private void close(Statement prep){
        try {prep.close();} catch (Exception e) {}
    }
    private void close(ResultSet res){
        try {res.close();} catch (Exception e) {}
    }
    Collection<String> tablasGuardar= new ArrayList<String>();
    private void reloadTablasGuardar(){
        tablasGuardar= new ArrayList<String>();
        tablasGuardar.add("ACCIONES");
        tablasGuardar.add("ADICONTRATOSRENTABILIDAD");
        tablasGuardar.add("BALANCE");
        tablasGuardar.add("BANDASLIQUIDEZ");
        tablasGuardar.add("BANDASVAR");
        tablasGuardar.add("CALCULOSRENTABILIDADCONTRATOS");
        tablasGuardar.add("CAMBIOESPERADOMONEDAS");
        tablasGuardar.add("CONTRATOS");
        tablasGuardar.add("CONTRATOSSIMPLES");
        tablasGuardar.add("CUENTAS");
        tablasGuardar.add("EMISORES");
        tablasGuardar.add("EMPRESAS");
        tablasGuardar.add("ESPECIES");
        tablasGuardar.add("FLUJOS");
        tablasGuardar.add("FLUJOSLIQUIDEZ");
        tablasGuardar.add("LIBROS");
        tablasGuardar.add("MONEDAS");
        tablasGuardar.add("POSICIONESACCIONES");
        tablasGuardar.add("POSICIONESESPECIES");
        tablasGuardar.add("PRODUCTOS");
        tablasGuardar.add("RELACIONACCIONESSUBCUENTAS");
        tablasGuardar.add("RELACIONBALANCESUBCUENTA");
        tablasGuardar.add("RELACIONESPECIESSUBCUENTAS");
        tablasGuardar.add("RELACIONMONEDASSUBCUENTAS");
        tablasGuardar.add("RELACIONSUBCUENTASPRODUCTOS");
        tablasGuardar.add("TASAS");
        tablasGuardar.add("TASASDEPAGOS");
        tablasGuardar.add("UNIDADESNEGOCIOS");
        tablasGuardar.add("VALORESCONTRATOS");
        tablasGuardar.add("VALORESMONEDAS");
        tablasGuardar.add("VALORESTASAS");
        tablasGuardar.add("VARCONTRATOSPRECIO");
        tablasGuardar.add("VARCONTRATOSTASA");
    }
}

